home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Tools / ApiHooks 3.0 / ApiHooksEXE.bat < prev    next >
Encoding:
DOS Batch File  |  2000-06-18  |  13.2 KB  |  372 lines

  1. ;@goto translate
  2.  
  3.  
  4. .586P
  5.  
  6. .MODEL             FLAT, STDCALL
  7.  
  8.    OPTION          CASEMAP: NONE
  9.  
  10.  
  11.    INCLUDE         WINDOWS.inc
  12.    UNICODE         = FALSE
  13.    INCLUDE         APIMACRO.mac
  14.  
  15.    INCLUDE         NTSTATUS.inc
  16.    INCLUDE         NtStruc.inc
  17.  
  18.    INCLUDE         AHinc.inc
  19.  
  20.    INCLUDE         ApiHooks.inc
  21.  
  22.    PIDERROR        EQU -1
  23.  
  24.  
  25.    INCLUDELIB      iKERNEL32.lib
  26.    INCLUDELIB      iUSER32.lib
  27.    INCLUDELIB      iApiHooks.lib
  28. ;------------------------------------------------------------------------------
  29.  
  30. .DATA?
  31.  ;place for non all-windows APIs
  32.    CreateToolhelp32Snapshot   DWORD  ?
  33.    Process32First             DWORD  ?
  34.    Process32Next              DWORD  ?
  35.    NtQueryInformationProcess  DWORD  ?
  36.    NtQuerySystemInformation   DWORD  ?
  37.  
  38.  ;OS version
  39.    W32Version       DWORD   ?
  40.  ;place for PIDs
  41.    PIDs      DWORD  300H       DUP  (?)
  42.  
  43.  ;for CreateProcess
  44.    stinfo    STARTUPINFO             <>
  45.    prinfo    PROCESS_INFORMATION     <>
  46.  
  47.    DllName   SIGN   MAX_PATH   DUP  (?)
  48.    ExeName   SIGN   MAX_PATH   DUP  (?)
  49.    HelpLine  SIGN   MAX_PATH   DUP  (?)
  50.  
  51.  ;had target parameters?
  52.    ExeAlone  BYTE   ?
  53.  
  54. .CODE
  55.    Errors    DWORD  sESU, sEEX, sEOP, sERA, sERE, sERF, sECL, sECP, sEPN, sETM
  56. ;------------------------------------------------------------------------------
  57.    TEXT      sTitle,<ApiHooks for Win32, version 2.2/0>
  58.    TEXT      ESU,   <Hooks established./0>
  59.    TEXT      EML,   <Module loaded./0>
  60.    TEXT      ELU,   <Module unloaded./0>
  61.    TEXT      EEX,   <Exception occurred/:/0>
  62.    TEXT      EOP,   <Can/-t open process/:/0>
  63.    TEXT      ERA,   <Remote Alloc failed/:/0>
  64.    TEXT      ERE,   <Hooks can/-t be found,/lare already present/lor are invalid/:/0>
  65.    TEXT      ELM,   <Can/-t load module/:/0>
  66.    TEXT      EUL,   <Module still loaded/:/0>
  67.    TEXT      ERF,   <Remote Free failed/:/0>
  68.    TEXT      ECL,   <ApiHooks /(-/)/(n | o | l | m | u/)[q | r] /(Hooks | Module/) /(Target | PID | ALL/) [Parameters]/l>
  69.              STRING <n = create new process and apply Hooks  o = open existing process  and apply Hooks/l>
  70.              STRING <l  = create new process and load Module  m = open existing process  and load Module/l>
  71.              STRING <u = open existing process  and unload Module/l>
  72.              STRING <q = no msg box if all went OK   r = no msg box at all/l>
  73.              STRING <Hooks = module containing hook procedures   Module = module to (un)load/l>
  74.              STRING <Target = process where to apply hooks   PID = ID of Target process as 0x hexadecimal number/l>
  75.              STRING <ALL = all processes are Targets   Parameters = command line parameters for Target/0>
  76.    TEXT      ECP,   <Can/-t create process/:/0>
  77.    TEXT      EPN,   <Process not found/:/0>
  78.    TEXT      ETM,   <Time out/:/0>
  79.  
  80.  ;non all-windows API names for GetProcAddress
  81.    TEXT      K32,  <KERNEL32.dll/0>
  82.    TEXTA     CT32S,<CreateToolhelp32Snapshot/0>
  83.    TEXTA     P32F, <Process32First/0>
  84.    TEXTA     P32N, <Process32Next/0>
  85.  
  86.    TEXTA     NTDLL,<NTDLL.dll/0>
  87.    TEXTA     NQIP, <NtQueryInformationProcess/0>
  88.    TEXTA     NQSI, <NtQuerySystemInformation/0>
  89. ;------------------------------------------------------------------------------
  90. ;Work with command line:
  91. ;IN: ESI - string, EDI str to copy ;OUT: ESI - string, EAX - BOOL, ZF set if no next parameter
  92.  
  93. GetParAndNextParPos    PROC USES EDI
  94.    XOR       EAX, EAX
  95.    ;skip 1st parameter
  96.    MOV       CL, '"'
  97.    MOV       [EDI], AL
  98.    LODSB
  99.    TEST      AL, AL
  100.    JE        StringQuit
  101.    CMP       AL, CL
  102.    JE        @F
  103.    DEC       ESI
  104.    MOV       CL, ' '
  105.   @@:
  106.    LODSB
  107.    STOSB
  108.    TEST      AL, AL
  109.    JE        NoNextPar
  110.    CMP       AL, CL
  111.    JNE       @B
  112.    MOV       BYTE PTR [EDI-1] ,0
  113.   ;find start of the next par - skip spaces
  114.   @@:
  115.    LODSB
  116.    TEST      AL, AL
  117.    JE        NoNextPar
  118.    CMP       AL, ' '
  119.    JBE       @B
  120.   NoNextPar:
  121.    MOV       AL, 1
  122.    DEC       ESI
  123.   StringQuit:
  124.    RET
  125. GetParAndNextParPos    ENDP
  126. ;------------------------------------------------------------------------------
  127.  PrimaryThread    PROC
  128.    iMOV      ESI, GetModuleHandleA
  129.    iMOV      EDI, GetProcAddress
  130.    sWin32    ESI, sNTDLL                 ;get NTDLL APIs
  131.    MOV       EBX, EAX
  132.    sWin32    EDI, EBX, sNQIP
  133.    MOV       NtQueryInformationProcess,  EAX
  134.    sWin32    EDI, EBX, sNQSI
  135.    MOV       NtQuerySystemInformation, EAX
  136.  
  137.    sWin32    ESI, sK32                   ;get KERNEL32 APIs
  138.    MOV       EBX, EAX
  139.    sWin32    EDI, EBX, sCT32S
  140.    MOV       CreateToolhelp32Snapshot, EAX
  141.    sWin32    EDI, EBX, sP32F
  142.    MOV       Process32First, EAX
  143.    sWin32    EDI, EBX, sP32N
  144.    MOV       Process32Next,  EAX
  145. ;------------------------------------------------------------------------------
  146.    iWin32    GetVersion
  147.    MOV       W32Version, EAX
  148.  
  149. ;evaluate command line
  150.    CLD
  151.    iWin32i   GetCommandLine
  152.    MOV       ESI, EAX
  153.    oLEA      EDI, HelpLine
  154.    sWin32    GetParAndNextParPos   ;apihooks.exe
  155.    TEST      EAX, EAX
  156.    JE        @F                    ;missing parameter -> wrong line
  157.    sWin32    GetParAndNextParPos   ;-nq
  158.    TEST      EAX, EAX
  159.    JE        @F                    ;missing parameter -> wrong line
  160.    MOV       EBX, [EDI]
  161.    sWin32    GetParAndNextParPos   ;hooks.dll
  162.    TEST      EAX, EAX
  163.    JE        @F                    ;missing parameter -> wrong line
  164.    MOV       EBP, ESI   ;EBP == command line for target (incl. target.exe)
  165.    iWin32i   ExpandEnvironmentStrings, EDI, OFFSET DllName, MAX_PATH
  166.    sWin32    GetParAndNextParPos   ;target.exe
  167.    TEST      EAX, EAX
  168.   @@:
  169.    JE        InvCmdLine            ;missing parameter -> wrong line
  170.    iWin32i   ExpandEnvironmentStrings, EDI, OFFSET ExeName, MAX_PATH
  171.    sWin32    GetParAndNextParPos   ;test if there are some parameters for target on the command line
  172.    SETE      ExeAlone              ;note it
  173.  
  174.    oLEA      EDI, DllName
  175.  
  176.    MOV       EAX, EBX              ;2 nd parameter -nq
  177.    OR        EAX, '    '           ;lowercase
  178.    MOV       ECX, EAX
  179.    SHR       ECX, 16
  180.    CMP       CL, 'q'               ;-?q  ?
  181.    JE        @F
  182.    CMP       CL, 'r'               ;-?r  ?
  183.    JNE       AllowMsgBox
  184.    MOV       BYTE PTR MsgJMP-2, 0EBH    ;if -?r skip over msgbox
  185.   @@:
  186.    MOV       BYTE PTR MsgJMP-1, SkipMsg-MsgJMP ;if -?r or -?q  skip msgbox if was success
  187.   AllowMsgBox:
  188.    CMP       AL, '-'
  189.    JNE       InvCmdLine
  190.    SHR       EAX, 8
  191.  
  192.    oMOV      EBX, 1                  ;default 1 PID in PIDs , EBX == PID counter
  193.  
  194.    CMP       AL, 'n'  ;new process & apihooks
  195.    JE        CreateNew
  196.    CMP       AL, 'o'  ;existing process & apihooks
  197.    JE        @F
  198.  
  199.    MOV       BYTE PTR GoToEAHT-1, (GoToLMT-GoToEAHT) ;change jump target
  200.    MOV       Errors[ErrorSuccess*4], sEML            ;replace hooks msg
  201.    MOV       Errors[ErrorRemoteExec*4], sELM         ;with module msg
  202.    CMP       AL, 'l'  ;new process & load module
  203.    JE        CreateNew
  204.    CMP       AL, 'm'  ;existing process& & load module
  205.    JE        @F
  206.  
  207.    MOV       BYTE PTR GoToEAHT-1, (GoToUMT-GoToEAHT)  ;change jump target
  208.    MOV       Errors[ErrorSuccess*4], sELU             ;replace hooks msg
  209.    MOV       Errors[ErrorRemoteExec*4], sEUL          ;with module msg
  210.    CMP       AL, 'u'  ;existing process & unload module
  211.    JNE       InvCmdLine  ;no more switches supported
  212. ;------------------------------------------------------------------------------
  213. ;evaluate  target
  214.   @@:
  215.    PUSH      EAX          ;save -?? switches
  216.    SUB       EDX, EDX
  217.    MOV       AX,  2000H
  218.    oLEA      ESI, ExeName
  219.    OR        EAX, [ESI]   ;prefix 0X -> 0x
  220.    oMOV      ECX, 8       ;max 8 hex characters
  221.    CMP       AX,  "x0"
  222.    JNE       StdName      ;no 0x prefix -> target is given by name
  223.    LODSW
  224.   NextHexFigure:          ;PID = Str2Hex(target)
  225.    LODSB
  226.    SUB       AL, "0"
  227.    JL        ConvEnd
  228.    CMP       AL,  9
  229.    JLE       HexFigure
  230.    AND       AL,  0DFH
  231.    SUB       AL,  7
  232.   HexFigure:
  233.    SHL       EDX, 4
  234.    OR        DL,  AL
  235.    LOOP      NextHexFigure
  236.   ConvEnd:
  237.    POP       ECX          ;restore -?? switches
  238.    JMP       SetPID
  239.  
  240. ;------------------------------------------------------------------------------
  241. ;target given by name
  242.  
  243.   StdName:
  244.    CMP       DWORD PTR [ESI], "LLA"  ;is it ALL ?
  245.    JNE       @F                      ;no -> find process
  246.    sWin32    BuildPIDList, OFFSET PIDs, SIZEOF PIDs/4 ;yes -> get all current PIDs
  247.    MOV       EBX, EAX
  248.    CMP       EAX, PIDERROR           ;returned PIDERROR -> failed
  249.    JE        FailPIDs
  250.    CMP       EAX, SIZEOF PIDs/4      ;my buffer is too small
  251.    oMOV      EAX, PIDERROR
  252.    JG        FailPIDs0
  253.   ;EBX contains number of PIDs in PIDs
  254.    POP       ECX                     ;restore -?? cmdline switches
  255.    JMP       SetPID0
  256.   @@:        ;find target by name
  257.    sWin32    FindProcessNT5, ESI     ;ESI == OFFSET ExeName == target.exe
  258.   FailPIDs0:
  259.    CMP       EAX, PIDERROR           ;returned PIDERROR -> failed
  260.   FailPIDs:
  261.    MOV       EDX, EAX
  262.    POP       ECX                     ;restore -?? cmdline switches
  263.    oMOV      EAX, ErrorProcNotFound
  264.    JE        Exitus
  265.   SetPID:
  266.    MOV       PIDs[0], EDX            ;found PID
  267.   SetPID0:
  268.    CMP       CL, 'o'                 ;was it open existing target and apply hooks?
  269.    JNE       GoOn                    ;no -> GetFullPathName is used with -o option but not with -m -u -l -n !
  270.    MOV       ECX, EDI
  271.   @@:
  272.    INC       ECX
  273.    MOV       AL, [ECX]
  274.    CMP       AL, "\"                 ;if hooks.dll doesn't contain PathTo
  275.    JE        @F
  276.    CMP       AL, 0
  277.    JNE       @B
  278.    PUSH      EAX
  279.    iWin32i   GetFullPathName, EDI, SIZEOF DllName, EDI, ESP  ;merge CurDir+Hooks.dll
  280.    POP       EAX
  281.   @@:
  282.    JMP       GoOn
  283. ;------------------------------------------
  284.   InvCmdLine:
  285.    oMOV      EAX, ErrorCommandLine
  286.    JMP       Exitus
  287. ;------------------------------------------
  288.    CreateNew:
  289.    CMP       ExeAlone, FALSE
  290.    JE        @F
  291.    oLEA      EBP, ExeName          ;if there are no target parameters then
  292.    iWin32i   lstrlen, EBP
  293.    MOV       WORD PTR [EBP+EAX], ' '   ;append space at the end of "target.exe"
  294.   @@:
  295.    MOV       BYTE PTR stinfo.cb, STARTUPINFO
  296.    SUB       ECX, ECX
  297.    iWin32i   CreateProcess,  ECX, EBP,\
  298.                              ECX, ECX, ECX,\
  299.                              CREATE_SUSPENDED OR CREATE_NEW_CONSOLE,\
  300.                              ECX, ECX,\
  301.                              OFFSET stinfo, OFFSET prinfo
  302.    TEST      EAX, EAX
  303.    oMOV      EAX, ErrorCreateProcess
  304.    JE        Exitus                ;can't create target
  305.    oMOV      PIDs[0], prinfo.dwProcessId
  306.   GoOn:
  307.    oLEA      ESI, PIDs
  308.   NextPID:
  309.    DEC       EBX                   ; --PID counter
  310.    JL        Exitus
  311.    LODSD                           ;get PID
  312.    PUSH      NULL                  ;for LoadAndCall == call nothing
  313.    PUSH      1                     ;(un)load 1 time also 1 millisecond
  314.    PUSHc     EDI, EAX
  315.    JMP       GoToEAHT              ;will be patched
  316.   GoToEAHT:
  317.    MOV       DWORD PTR [ESP+8], 10000   ;adjust milliseconds to 10ms
  318.    iWin32    EstablishApiHooksTimeNTA
  319.    POP       ECX                   ;remove parameter for LoadAndCall
  320.    JMP       NextPID
  321.   GoToLMT:
  322.    iWin32    LoadAndCallA
  323.    MOV       ECX, EAX              ;save return code
  324.    CMP       ECX, ErrorTimeOut
  325.    oMOV      EAX, ErrorSuccess     ;module was loaded -> return success
  326.    JA        NextPID
  327.    oMOV      EAX, ErrorRemoteExec
  328.    JECXZ     NextPID               ;module wasn't loaded -> return error
  329.   NextPID0:
  330.    MOV       EAX, ECX              ;else return original error
  331.    JMP       NextPID
  332.   GoToUMT:
  333.    iWin32    UnloadModuleA
  334.    POP       EDX                   ;remove parameter for LoadAndCall
  335.    MOV       ECX, EAX              ;save return code
  336.    CMP       ECX, ErrorTimeOut
  337.    oMOV      EAX, ErrorRemoteExec  ;module wasn't unloaded -> return error
  338.    JA        NextPID
  339.    oMOV      EAX, ErrorSuccess     ;module was loaded -> return success
  340.    JECXZ     NextPID
  341.    JMP       NextPID0              ;else return original error
  342.  
  343.   Exitus:
  344.    PUSH      EAX                   ;parameter for ExitProcess
  345.    MOV       EDX, Errors[EAX*4]    ;choose error message
  346.    TEST      EAX, EAX
  347.    JE        MsgJMP                ;will be patched
  348.    MsgJMP:
  349.    iWin32i   MessageBox, NULL, EDX, ssTitle, MB_OK
  350.   SkipMsg:
  351.    MOV       EBX, prinfo.hThread   ;if was -n or -l target must be closed
  352.    TEST      EBX, EBX
  353.    JE        @F
  354.    iWin32    CloseHandle, prinfo.hProcess     ;close target process
  355.    iWin32    ResumeThread, EBX                ;resume its primary thread
  356.    iWin32    CloseHandle,  EBX                ;and close it
  357.   @@:
  358.    iWin32    ExitProcess                      ;exit with error code
  359.  PrimaryThread ENDP
  360. ;-------------------------------------------------------------------------------
  361.    INCLUDE   FindProc.inc
  362. END PrimaryThread
  363.  
  364. :translate
  365. @ECHO OFF
  366. ML   /c /coff /nologo ApiHooksEXE.bat
  367. eLINK ApiHooksEXE /OUT:ApiHooks.exe /IGNORE:4108,4078,4060 /nologo /STUB:PEstub.exe /SUBSYSTEM:WINDOWS /MERGE:.idata=.text /MERGE:.rdata=.text /SECTION:.text,EWR /COMMENT:"        http://elicz.cjb.net            http://elicz.tsx.org            "
  368. eLINK -EDIT -NOLOGO ApiHooks.exe -SECTION:.text=" " -SECTION:.data=" " -RELEASE
  369. rem BIND -u ApiHooks.exe
  370. DEL  ApiHooksEXE.obj
  371. PAUSE
  372. CLS